Chod hore
Predchádzajúca stránka Nasledujúca stránka Začiatok kapitoly Koniec kapitoly Začiatok kurzu Koniec kurzu


11. REŤAZCE


S textovými konštantami sme sa už stretli. Typ reťazec potrebujeme nato, aby sme mohli pracovať s rôznymi textovými hodnotami a aby sme mohli meniť ich obsah.



11.1 Premenná typu reťazec (string)


Reťazec je postupnosť znakov. Jeho prvkom môže byť ľubovolný ASCII znak (#0..#255). Dĺžka reťazca môže byť maximálne 255. Aktuálna dĺžka reťazca je uložená na začiatku reťazca (1 Byte).

Napr.

Var Meno : String[Max] ;
...
Meno := 'Katka' ;

bude uložené nasledovne:

Obr11_1


Ak sa v deklarácii neuvedie maximálna dĺžka reťazca, potom dĺžka reťazca je 255. Premenná typu String môže byť aj "prázdna" - potom jej dĺžka je 0.



11.2 Operácie s reťazcami


Reťazce - premenné aj konštanty - môžeme porovnávať pomocou =, <>, <, <=, > a >=. Porovnávanie sa začína vždy od prvého znaku. Ten znak je väčší, ktorého ASCII kód je väčší. Ak prvé znaky sú rovnaké, potom sa porovnávajú druhé znaky atď. Ak jeden reťazec sa skôr skončí, potom ten dlhší je väčší. Ak sú rovnako dlhé a obsahujú rovnaké znaky na rovnakých miestach, potom reťazce sú rovnaké.

Pozor! V prípade diakritických písmen usporiadanie nie je korektné (napr. v slovenčine). Ak chceme zaručiť správne porovnávanie, potom musíme napísať pre tento účel program sami.

Reťazce môžeme pospájať pomocou operácie +.

VarFarba : String[10] ;
 Tvrdenie : String[30] ;
... 
 Farba := 'červené' ;
 Tvrdenie := 'Mám '+Farba+' auto.' ;


Obsah premennej Tvrdenie bude 'Mám červené auto.'
Tak ako aj v ostatných prípadoch aj teraz sa vyhodnotí pravá strana priradenia a výsledok sa priradí premennej na ľavej strane. Ak sa nezmestí, potom sa skracuje. Napr. ak premenná Tvrdenie by bolo typu String[10], potom jej obsah po priradení by bol 'Mám červen'.

Úloha
Načítajme znaky. Koncovým znakom je "*". Ak znak je písmeno alebo číslica, potom ich zbierajme, inak vydajme zvukové znamenie. Nakoniec vypíšme zozbierané znaky v tom poradí ako boli zadané.

Obr11_2


Musíme dávať pozor pri načítaní, lebo to robíme pomocou príkazu ReadLn. Ak by sme zadali súčasne viac znakov a až potom by sme stlačili ENTER - program by spracoval iba prvý znak a ostatné by sa stratili. Príkaz ReadLn maže obsah bufra.



11.3 Indexácia reťazca


Na každý znak premennej typu String alebo konštanty sa môžeme odvolať aj tak, že zadáme jeho poradové číslo. Poradové číslo píšeme za identifikátorom v hranatých zátvorkách. Toto poradové číslo je index a takéto odvolanie sa volá indexáciou.

Musíme dávať pozor aby sme neprekročili aktuálnu dĺžku reťazca. Nebude to syntaktickou chybou, ale obsahom bude náhodný znak (to, čo sa nachádzalo na tom mieste v pamäti, a ktoré už nie je súčasťou reťazca).

Aktuálnu dĺžku reťazca môžeme zistiť dvoma spôsobmi. Pomocou funkcie Length(Reťazec) - v prípade konštanty je to počet znakov a v prípade premennej je to hodnota nultého bájtu (Byte). Tak ako ostatné prvky reťazca aj nultý má typ Char jeho hodnota môže byť od #0 po #255. Pre nás je podstatné jeho poradové číslo, čo je vlastne aktuálna dĺžka reťazca. Teda aktuálnu dĺžku reťazca môžeme vypísať nasledujúcimi dvoma spôsobmi:

WriteLn(Length(Retazec)) ;
WriteLn(Ord(Retazec[0])) ;


Posledné sa nezvykne používať.

Jednotlivé znaky premennej typu String môžeme aj jednotlivo meniť pomocou priradenia. Napr. zmeniť písmená v reťazci Meno na veľké môžeme nasledovne:

For I := 1 To Length(Meno) Do
Meno[I] := UpCase(Meno[I]) ;